package dca.sistemascontrole.sinais;

/**
 *
 * @author Rafael
 */
public abstract class Sinal {

    protected long t0;
    protected float periodo;
    protected float amplitude;
    protected float tempoAtuacao;
    public static final int DEGRAU = 3;
    public static final int SENOIDAL = 4;
    public static final int QUADRADA = 5;
    public static final int DENTE_DE_SERRA = 6;
    public static final int ALEATORIO = 7;

    public Sinal(float periodo, float amplitude, float tempoAtuacao) {
        t0 = System.currentTimeMillis();
        this.periodo = periodo;
        this.amplitude = amplitude;
        this.tempoAtuacao = tempoAtuacao;
    }

    protected abstract float getValue(long t);

    public float getNextValue(long t) {
        if ((t - t0) > tempoAtuacao) {
            return 0;
        }

        float value = getValue(t);

        if (value > 3) {
            value = 3;
        } else if (value < 0) {
            value = 0;
        }

        return value;
    }

    public float getPeriodo() {
        return periodo;
    }

    public float getAmplitude() {
        return amplitude;
    }

    public float getTempoAtuacao() {
        return tempoAtuacao;
    }

    public static Sinal gerarSinal(int tipoSinal, float periodo, float amplitude, float tempoAtuacao) {
        Sinal sinal;
        switch (tipoSinal) {
            case DEGRAU:
                sinal = new Degrau(amplitude, tempoAtuacao);
                break;
            case SENOIDAL:
                sinal = new Senoidal(periodo, amplitude, tempoAtuacao);
                break;
            case QUADRADA:
                sinal = new OndaQuadrada(periodo, amplitude, tempoAtuacao);
                break;
            case DENTE_DE_SERRA:
                sinal = new DenteDeSerra(periodo, amplitude, tempoAtuacao);
                break;
            case ALEATORIO:
                sinal = new Aleatorio(amplitude, tempoAtuacao);
                break;
            default:
                sinal = new Degrau(0, 10);
        }

        return sinal;
    }
}
